
package Controller;

import Model.Model;
import View.View;
import com.google.api.services.drive.model.File;
import java.awt.event.*;
import java.util.List;
/**
 * Klasa kontrolera
 * @param view - referencja na widok.
 * @param model - referencja na model.
 */
public class Controller {
 private final Model model;
 private final View view;
     
  public Controller() {
      
      this.model = new Model();
      this.view = new View(this);
      
      view.addZalogujListener(new ZalogujListener());
      view.addWylogujListener(new WylogujListener());
      try {
      model.setConfigValues();
      }
      catch(RuntimeException e) {
        view.showError(e.getMessage() + " \nNalezy przejść do menu konfiguracji programu i podać poprawne ścieżki aby korzystać z programu.");  
      }
  }
   /**
    * 
    * @return ścieżkę do pliku z danymi sesji na dysku.
    */
   public String doGetLoginInfoPath() {
      if(model.getLoginInfoPath() != null) {
           return model.getLoginInfoPath();
       }
      else {
           return "";
       }
   }
   /**
    * 
    * @return katalog do którego pobierane są pliki.
    */
   public String doGetDownloadPath() {
      if(model.GetDownloadPath() != null) {
           return model.GetDownloadPath();
       }
      else {
           return "";
       }
   }
   /**
    * Aktualizuje domyślny katalog do zapisu plików
    * @param path scieżka do katalogu do którego pobierane są pliki.
    */
   public void doUpdateDownloadPath(String path) {
       try {
       model.updateDownloadPath(path);
       } catch(RuntimeException e) {
           view.showError(e.getMessage());
       }
   }
   /**
    * Aktualizuje plik z danymi sesji na dysku.
    * @param filepath scieżka do pliku z danymi sesji.
    */
   public void doUpdateConfigPath(String filepath) {
      try {
      model.updateConfigPath(filepath);
      model.deleteFile(model.getCredentialsInfoPath());
      } catch(RuntimeException e) {
        view.showError(e.getMessage());
      }
   }
   /**
    * Zmienia nazwę pliku
    * @param filename nazwa pliku
    * @param newTitle nowa nazwa pliku
    * @return czy operacja powiodła się
    */
   public boolean doRenameFile(String filename, String newTitle) {
       try {
         if(!view.findEqual(newTitle)) {
                view.addNewUpload(newTitle);
                model.renameFile(model.GetFileID(filename), newTitle); 
         }
         else {
                view.showError("Plik o takiej nazwie już znajduje się na dysku google.");
                view.find(newTitle);
                return false;
         }  
       }
       catch (RuntimeException e) {
         view.showError(e.getMessage());    
         return false;
       }
       return true;
   }
   /**
    * Usuwa plik przenosząc do kosza.
    * @param filename nazwa pliku
    * @return czy operacja powiodła się
    */
   public boolean doTrashFile(String filename) {
      try {
        model.trashFile(model.GetFileID(filename));  
      }
      catch(RuntimeException e) {
        view.showError(e.getMessage());
        return false;
      }
      return true;
   }
   /**
    * Zwraca listę plików na internetowym dysku google.
    * @return lista plików
    */
   public List<File> doGetFilesList() {
       List<File> files;
       try {
           files = model.getFilesList();
       }
       catch(RuntimeException e) {
           view.showError(e.getMessage());
           return null;
       } 
       return files;
       
   }
  /**
   * Pobiera id pliku na podstawie jego nazwy.
   * @param filename nazwa pliku
   * @return id pliku
   */
   public String doGetFileID(String filename) {
     try {
     return model.GetFileID(filename);
     } catch(RuntimeException e) {
       view.showError(e.getMessage());
       return null;
     }
   }
   /**
    * Tworzy foler na dysku zewnętrznym google
    * @param title nazwa folderu
    * @param parent_id id folderu rodzica
    * @return czy operacja się powiodła
    */
   public boolean doInsertFolder(String title, String parent_id) {
     try{
         if(!view.findEqual(title)) {
                view.addNewUpload(title);
                model.insertFolder(title, parent_id);
         }
         else {
                view.showError("Folder o takiej nazwie już znajduje się na dysku google.");
                view.find(title);
                return false;
         }  
     }
     catch(RuntimeException e) {
        view.showError(e.getMessage());
        return false;
     }
     return true;
   }
   /**
    * Wysyła plik na dysk internetowy, nie pozwala na wysłanie pliku o już istniejącej nazwie na dysku.
    * @param file referencja na plik 
    * @param parent_id id rodzica
    * @return czy operacja powiodła się
    */
   public boolean doInsertFile(java.io.File file, String parent_id) {
     try{
        if(!view.uploadExists(file.getName())) {
            if(!view.findEqual(file.getName())) {
                view.addNewUpload(file.getName());
                model.insertFile(file, parent_id,this);
            }
            else {
                view.showError("Plik o takiej nazwie już znajduje się na dysku google.");
                view.find(file.getName());
                return false;
            }
        }
        else {
            view.showError("Plik znajduje się już na liście pobierania."); 
            return false;
        }
     }
     catch(RuntimeException e) {
        view.showError(e.getMessage());
        return false;
     }
     return true;
  }
  /**
   * Aktualizuje postęp ściągania pliku.
   * @param filename nazwa pliku
   * @param val ile procent zostało ściągnięte
   */
  public void doUpdateDownloadProgress(String filename, int val) {
    view.updateDownloadProgress(filename, val);
  }
  /**
   * Aktualizuje postęp wysylania pliku.
   * @param filename nazwa pliku
   * @param val ile procent zostało wysłane
   */
  public void doUpdateUploadProgress(String filename, int val) {
    view.updateUploadProgress(filename, val);
  }
  /**
   * Pobiera plik z dysku internetowego.
   * @param filename nazwa pliku
   * @return czy operacja powiodła się 
   */
  public boolean doDownloadFile(String filename) {
    try {
        if(!view.downloadExists(filename)) {
            view.addNewDownload(filename);
            model.downloadFile(filename,this);
        }
        else {
            view.showError("Plik znajduje się już na liście pobierania.");
            return false;
        }
            
    }
    catch(RuntimeException e) {
        view.showError(e.getMessage());
        return false;
    }
    return true;
  }
   /**
    * Klasa realizująca akcję po kliknięciu przycisku zaloguj w menu - słuchacz.
    */
   class ZalogujListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent action)
    {

        try {
            model.doAuthorize();
            } 
        catch (RuntimeException e) {
              view.showError(e.getMessage());
              return;
            }
        model.buildService();   
        view.setZalogowany();
        
     }
      
   }
  /**
   * Klasa realizująca wylogowanie po kliknięciu przycisku w menu - słuchacz.
   */
  class WylogujListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent action)
    {
        view.setWylogowany();
        model.deleteFile(model.getCredentialsInfoPath());
    }  
  }
}
